using System.Diagnostics;
using static System.Collections.Specialized.BitVector32;
using System.Text;
using System.Windows.Forms;
using System.Text.Unicode;

namespace Frp客户端
{
    public partial class Form1 : Form
    {
        public static string? iniFilePath = Environment.CurrentDirectory + "\\frp\\client.ini";
        public static string? exeFilePath = @".\frp\frpc.exe";
        public static string? configFilePath = @"-c.\frp\client.ini";
        int type = 0;

        public Form1()
        {
            InitializeComponent();
            CreateConfigFile();
            ReadConfigFile();
            Redini();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                // 先停止正在运行的frpc.exe进程
                StopFrpcProcess();

                // 等待一小段时间，确保进程完全关闭（可以根据实际情况调整等待时间，这里等待1秒）
                System.Threading.Thread.Sleep(1000);

                // 再重新启动frpc.exe进程，调用的代码和之前启动它的逻辑类似
                if (type == 0)
                {
                    StartFrpcProcess0();
                }
                else
                {
                    StartFrpcProcess1();
                }
            
                
            }
            catch (Exception ex)
            {
                Console.WriteLine($"重启程序时出错: {ex.Message}");
            }

        }
        static void StopFrpcProcess()
        {
            // 获取所有名为frpc.exe的进程
            Process[] processes = Process.GetProcessesByName("frpc");
            foreach (Process process in processes)
            {
                try
                {
                    // 尝试关闭该进程
                    process.Kill();
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"关闭frpc.exe进程时出错: {ex.Message}");
                }
            }
        }

        static void StartFrpcProcess1()
        {
            try
            {
                Process process = new Process();
                // 设置要启动的进程的文件名，这里使用相对路径指向frp文件夹下的frpc.exe
                process.StartInfo.FileName = @".\frp\frpc.exe";
                // 设置命令行参数，对应 -c.\client.ini
                process.StartInfo.Arguments = @"-c.\frp\client.ini";
                // 设置工作目录为包含frp文件夹的当前目录（这样相对路径才能正确指向对应的exe和ini文件）
                process.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
                // 配置窗口样式等，以下配置为隐藏命令行窗口，如果你希望显示窗口可以根据需要调整
                process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                process.StartInfo.CreateNoWindow = true;
                // 启动进程
                process.Start();
                MessageBox.Show("Frp客户端已启动！");
            }
            catch (Exception ex)
            {
                MessageBox.Show("启动Frp客户端失败！"+ex.Message);
            }
           
        }
        static void StartFrpcProcess0()
        {
            try
            {
                Process process = new Process();
                // 设置要启动的进程的文件名，这里使用相对路径指向frp文件夹下的frpc.exe
                process.StartInfo.FileName = @".\frp\frps.exe";
                // 设置命令行参数，对应 -c.\client.ini
                process.StartInfo.Arguments = @"-c.\frp\config.ini";
                // 设置工作目录为包含frp文件夹的当前目录（这样相对路径才能正确指向对应的exe和ini文件）
                process.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
                // 配置窗口样式等，以下配置为隐藏命令行窗口，如果你希望显示窗口可以根据需要调整
                process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                process.StartInfo.CreateNoWindow = true;
                // 启动进程
                process.Start();
                MessageBox.Show("Frp客户端已启动！");
            }
            catch (Exception ex)
            {
                MessageBox.Show("启动Frp客户端失败！" + ex.Message);
            }
            
        }
        public void Redini()
        {
            try
            {
                using (StreamReader reader = new StreamReader(iniFilePath,Encoding.UTF8))
                {
                    string fileContent = reader.ReadToEnd();
                    textBox2.Text = fileContent;
                    Console.WriteLine(fileContent);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: " + e.Message);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // 将修改后的配置信息写回文件
            using (StreamWriter writer = new StreamWriter(iniFilePath, false, Encoding.UTF8))
            {
                writer.WriteLine(textBox2.Text);

            }
        }

        public void CreateConfigFile()
        {
            string rootDirectory = AppDomain.CurrentDomain.BaseDirectory;
            string configFilePath = Path.Combine(rootDirectory, "config.txt");

            if (!File.Exists(configFilePath))
            {
                try
                {
                    // 定义默认值内容
                    string defaultContent = "0";
                    File.WriteAllText(configFilePath, defaultContent);
                    Console.WriteLine("文本格式配置文件已成功创建并写入默认值。");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"创建配置文件时出错: {ex.Message}");
                }
            }
            else
            {
                Console.WriteLine("文本格式配置文件已存在。");
            }
        }
        public void ReadConfigFile()
        {
            string rootDirectory = AppDomain.CurrentDomain.BaseDirectory;
            string configFilePath = Path.Combine(rootDirectory, "config.txt");
            try
            {
                using (StreamReader reader = new StreamReader(configFilePath))
                {
                    string fileContent = reader.ReadToEnd();
                   type= int.Parse(fileContent);
                    Console.WriteLine(fileContent);
                }
                if (type == 0)
                {
                     iniFilePath = Environment.CurrentDirectory + "\\frp\\config.ini";
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: " + e.Message);
            }
        }
    }

}
